package com.zzq.my.jetpacks.jectpackapp.utils

//class DeepCopy {
//
//}
interface DeepCopyable<out R> {
    fun deepCopy(): R
}

// 一. kotlin实现对象的深度拷贝
// 实现方式: 使用 直接 "创建对象" 的方式实现深度拷贝
// 优点: 可以用于 "data-class" 和 "非data-class"
// 缺点: a. 需要实现接口并实现接口中的方法, 使用麻烦
//      b. 对于属性层级太深的类型, 实现起来会非常麻烦, 而且有可能导致某些属性无法实现深层拷贝
data class Person(var name:String, var age:Int, var sex: Boolean)
data class Panda (var name:String, var owner:Person) : DeepCopyable<Panda> {
    override fun deepCopy(): Panda {
        return Panda(name, Person(owner.name, owner.age, owner.sex))
    }
}

class A(var name:String)
class B(var field: A) : DeepCopyable<B> {
    override fun deepCopy(): B {
        // 数字, 整型数据类型都有一个缓存 [-128, 127], 拷贝前后的属性对象会指向同一个
        // 字符串常量, 会放置在常量池中, 拷贝前后的属性对象也会指向同一个
        // return B(A(field.name.copy)) // 基本类型 和 String 不需要 拷贝 !!
        return B(A(field.name))
    }
}

fun main() {
    // 0x1: 对于普通类
    val b = B(A("哈哈哈"))
    val bCopy = b.deepCopy()
    println(b === bCopy)                // false
    println(b.field === bCopy.field)      // false

    // 0x2. 对于数据类:
    val panda = Panda("团团", Person("张三", 22, true))
    val pandaCopy = panda.copy()
    val pandaDeepCopy = panda.deepCopy()
    println("===================== for copy")
    println(panda === pandaCopy)        // false
    println(panda === pandaDeepCopy)    // false
    println("===================== for owner-field of copy-object")
    println(panda.owner === pandaCopy.owner)        // true  (浅拷贝, 拷贝后的对象的属性还是会执行源对象的属性)
    println(panda.owner === pandaDeepCopy.owner)    // false
}


